#include "util.hpp"
#include "dp.hpp"
#include <cstring>
#include "dir_ctl.hpp"

const std::string local = "localhost";
const std::string user = "file";
const std::string password = "123456789As@";
const std::string db = "file_base";
const uint16_t port = 3306;
const std::string charset = "utf-8";

void login(user_table &user) // 注册页面
{
    Json::Value root;
    while (1)
    {
        std::cout << "输入用户名: " << std::endl;
        std::string str;
        getline(std::cin, str);
        root["name"] = str.c_str();

        debug_log("输入密码: ");
        getline(std::cin, str);
        root["password"] = str.c_str();

        if (!user.insert(root))
        {
            debug_log("注册错误,重新注册");
            continue;
        }
        debug_log("注册成功,重新登录");
        return;
    }
}

void menu()
{
    std::string str = "----------";
    printf("%s 注册用户: ./mybin login                                 %s\n", str.c_str(), str.c_str());
    printf("%s 用户登录: ./mybin 用户名 密码                            %s\n", str.c_str(), str.c_str());
    printf("%s 创建文件:createfile 文件名                               %s\n", str.c_str(), str.c_str());
    printf("%s 列出当前目录的所有文件:dirfile                           %s\n", str.c_str(), str.c_str());
    printf("%s 读文件:readfile 文件名                                  %s\n", str.c_str(), str.c_str());
    printf("%s 写文件:writefile 文件名 (app,in,或者默认)                %s\n", str.c_str(), str.c_str());
    printf("%s 删除文件:deletefile 文件名                               %s\n", str.c_str(), str.c_str());
    printf("%s 查看菜单:menu                                           %s\n", str.c_str(), str.c_str());
    printf("%s 修改文件权限:setfile 文件名 (wrx) 权限位置给对应字母      %s\n", str.c_str(), str.c_str());
    printf("%s 创建新目录 createdir 目录名                              %s\n", str.c_str(), str.c_str());
    printf("%s 展示所有目录 showdir                                     %s\n", str.c_str(), str.c_str());
    printf("%s 切换目录 chadir 目录名                                   %s\n", str.c_str(), str.c_str());
    printf("%s 删除目录 deletedir 目录名                                %s\n", str.c_str(), str.c_str());
    printf("%s 展示当前目录 curdir 目录名                               %s\n", str.c_str(), str.c_str());

}

bool enter(user_table &user, Json::Value &root)
{
    if (!user.login(root))
    {
        debug_log("登录失败,用户不存在");
        return false;
    }
    return true;
}

int main(int argc, char *argv[])
{
    menu();
    user_table use(local, user, password, db, port);
    if (argc == 2)
    {
        if (!strcmp(argv[1], "login"))
        {
            login(use);
            return 0;
        }
    }

    if (argc < 3)
    {
        debug_log("格式错误, 请用: ./mybin Username Userpassword");
        return 0;
    }

    std::string username = argv[1];
    std::string password = argv[2];
    if (username.empty() || password.empty())
    {
        error_log("格式错误, 请用: ./mybin Username Userpassword");
        return 0;
    }

    Json::Value root;
    root["name"] = username.c_str();
    root["password"] = password.c_str();
    bool ret = enter(use, root);
    if (!ret)
    {
        return 0;
    }

    dir_ctl total_dir;

    // 登录成功，创建家目录
    debug_log("登录成功，创建家目录");
    total_dir.create_dir(username);

    std::string result;
    std::vector<std::string> v;
    // 当前目录
    file_dir *cur_dir = total_dir.get_fir(username);

    std::cout << username << ": ";

    while (getline(std::cin, result))
    {
        string_util::str_cut(result, " ", v);
        std::string op = v[0];
        if (op == "createfile")
        {
            if (v.size() == 1)
            {
                std::cout << "参数数量不对" << std::endl;
            }
            else
            {
                cur_dir->create(username, v[1]);
            }
        }
        else if (op == "deletefile")
        {
            if (v.size() == 1)
            {
                std::cout << "参数数量不对" << std::endl;
            }
            else
            {
                cur_dir->dele(v[1]);
            }
        }
        else if (op == "readfile")
        {
            if (v.size() == 1)
            {
                std::cout << "参数数量不对" << std::endl;
            }
            else
            {
                std::cout << cur_dir->read(username, v[1]) << std::endl;
            }
        }
        else if (op == "writefile")
        {
            if (v.size() == 1)
            {
                std::cout << "参数数量不对" << std::endl;
            }
            else
            {
                if (v.size() == 2)
                {
                    v.push_back("in");
                }
                cur_dir->write(username,v[1], v[2]);
            }
        }
        else if (op == "dirfile")
        {
            cur_dir->show_file();
        }
        else if (op == "menu")
        {
            menu();
        }
        else if(op == "setfile")
        {
            if (v.size() != 3)
            {
                std::cout << "参数数量不对" << std::endl;
            }
            else
            {
                cur_dir->setfile(username, v[1],v[2]);
            }
        }
        else if(op == "createdir")
        {
            if (v.size() != 2)
            {
                std::cout << "参数数量不对" << std::endl;
            }
            else
            {
                total_dir.create_dir(v[1]);
            }
        }
        else if(op == "showdir")
        {
            if (v.size() != 1)
            {
                std::cout << "参数数量不对" << std::endl;
            }
            else
            {
                total_dir.show_dir();
            }
        }
        else if(op == "chadir")
        {
            if (v.size() != 2)
            {
                std::cout << "参数数量不对" << std::endl;
            }
            else
            {
                cur_dir = total_dir.get_fir(v[1]);
            }
        }
        else if(op == "deletedir")
        {
            if (v.size() != 2)
            {
                std::cout << "参数数量不对" << std::endl;
            }
            else
            {
                total_dir.delete_dir(v[1]);
            }
        }
        else if(op == "curdir")
        {
            if (v.size() != 1)
            {
                std::cout << "参数数量不对" << std::endl;
            }
            else
            {
                cur_dir->cur_dir();
            }
        }
        else
        {
            std::cout << "未知命令" << std::endl;
        }
        v = std::vector<std::string>();
        std::cout << username << ": ";
    }

    sleep(10);

    return 0;
}